package main

import (
	"fmt"
	"encoding/json"
)

/**
  结构体

  函数和方法的区别： 函数不属于任何类型，方法属于特定的类型
 */
func main() {
	//fmt.Println(User{username: "zpp",sex: 1})

	//var user *User = &User{}
	//fmt.Printf("%p %#v\n", user)

	//&User{}和new(User) 本质上是⼀一样的，都是返回⼀一个结构体的地址
	//var user2 *User = new(User)

	//fmt.Printf("%p %#v\n", user2)

	//tag()

	//a := struct {
	//	name string
	//	age int
	//}{
	//	name: "zpp",
	//	age: 10,
	//}
	//
	//fmt.Println("匿名结构体json->",a)

	personTest()
}

//字段类型后⾯面，以反引号括起来的
//key-value结构的字符串串，多个tag
//以逗号隔开。
type User struct {
	Username string `json:"username"` //tag
	Sex int          `json:"sex"`
	Age int          `json:"age"`
	//address Address
	//int              //匿匿名字段默认采⽤用类型名作为字段名
	//string
}
type Address struct {
	City string
	Province string
}

/**
  结构体标签
 */
func tag()  {
	user := &User{
		Username: "user01",
		Sex:      1,
		Age:      1,
	}
	data, _ := json.Marshal(user)
	//字段首字母小写的话json str打印空
	fmt.Printf("json str:%s\n", string(data))
}

/**
  User对象的方法
 */
func (u User) setUsername(name string){
	u.Username = name
}

/**
  指针类型
 */
func (u *User) setPointerUsername(name string){
	u.Username = name
}


//多重继承与冲突解决
type Mother struct {
	Name string
}

type Father struct {
	Name string
}

type People struct {
	Sex string
	Age int
	*Mother
	*Father
}

func (p People) m(){
	p.Mother.Name = "ss"
}

//结构体：内存地址引用
type Person struct {
	Name string
	Age int
}

func personTest(){
	a := &Person{
		Name : "zpp",
		Age: 10,
	}
	a.Name = "888"
	personTest1(a)
	personTest2(a)
}

func personTest1(p *Person)  {
	p.Age = 30
	fmt.Println("personTest1->",p)
}

func personTest2(p *Person)  {
	p.Age = 20
	fmt.Println("personTest2->",p)
}